{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Interactive visualization of MPI simulaitons\n",
    "\n",
    "In this example, which builds on our previous one of interactive MPI monitoring, we now demonstrate how to use the IPython data publication APIs.\n",
    "\n",
    "\n",
    "\n",
    "## Load IPython support for working with MPI tasks\n",
    "\n",
    "First, we create a cluster using `mpi` to launch the engines.\n",
    "This launches the engines using `mpiexec` so they are in the same mpi universe.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using existing profile dir: '/Users/minrk/.ipython/profile_default'\n",
      "Starting 4 engines with <class 'ipyparallel.cluster.launcher.MPIEngineSetLauncher'>\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "da09992ca3fd438eadf96a6599d5384e",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/4 [00:00<?, ?engine/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import ipyparallel as ipp\n",
    "\n",
    "n = 4\n",
    "\n",
    "rc = ipp.Cluster(engines=\"mpi\", n=n).start_and_connect_sync()\n",
    "view = rc[:]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's also load the plotting and numerical libraries so we have them ready for visualization later on."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now, we load the MPI libraries into the engine namespaces, and do a simple printing of their MPI rank information to verify that all nodes are operational and they match our cluster's real capacity.  \n",
    "\n",
    "Here, we are making use of IPython's special `%%px` cell magic, which marks the entire cell for parallel execution.  This means that the code below will not run in this notebook's kernel, but instead will be sent to *all* engines for execution there.  In this way, IPython makes it very natural to control your entire cluster from within the notebook environment:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "view.activate()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[stdout:0] MPI rank: 0/4\n",
      "[stdout:1] MPI rank: 1/4\n",
      "[stdout:2] MPI rank: 2/4\n",
      "[stdout:3] MPI rank: 3/4\n"
     ]
    }
   ],
   "source": [
    "%%px --block\n",
    "# MPI initialization, library imports and sanity checks on all engines\n",
    "from mpi4py import MPI\n",
    "# Load data publication API so engines can send data to notebook client\n",
    "from ipyparallel.datapub import publish_data\n",
    "import numpy as np\n",
    "import time\n",
    "\n",
    "mpi = MPI.COMM_WORLD\n",
    "bcast = mpi.bcast\n",
    "barrier = mpi.barrier\n",
    "rank = mpi.rank\n",
    "print(\"MPI rank: %i/%i\" % (mpi.rank,mpi.size))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We write a utility that reorders a list according to the mpi ranks of the engines, since all gather operations will return data in engine id order, not in MPI rank order.  We'll need this later on when we want to reassemble in IPython data structures coming from all the engines: IPython will collect the data ordered by engine ID, but our code creates data structures based on MPI rank, so we need to map from one indexing scheme to the other.  This simple function does the job:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "ranks = view['rank']\n",
    "engine_mpi = np.argsort(ranks)\n",
    "\n",
    "def mpi_order(seq):\n",
    "    \"\"\"Return elements of a sequence ordered by MPI rank.\n",
    "\n",
    "    The input sequence is assumed to be ordered by engine ID.\"\"\"\n",
    "    return [seq[x] for x in engine_mpi]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## MPI simulation example"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This is our 'simulation', a toy example that computes $\\sin(f(x^2+y^2))$ for a slowly increasing frequency $f$ over a gradually refined mesh.  In a real-world example, there typically is a 'simulate' method that, afer setting up initial parameters, runs the entire computation.  But having this simple example will be sufficient to see something that changes visually as the computation evolves and that is quick enough for us to test.\n",
    "\n",
    "And while simple, this example has a realistic decomposition of the spatial domain in one array per MPI node that requires care in reordering the data for visualization, as would be needed in a real-world application (unless your code accumulates data in the rank 0 node that you can grab directly)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%px --block\n",
    "\n",
    "# Global flag in the namespace\n",
    "stop = False\n",
    "\n",
    "\n",
    "def simulation(nsteps=100, delay=0.1):\n",
    "    \"\"\"Toy simulation code, computes sin(f*(x**2+y**2)) for a slowly increasing f\n",
    "    over an increasingly fine mesh.\n",
    "\n",
    "    The purpose of this code is simply to illustrate the basic features of a typical\n",
    "    MPI code: spatial domain decomposition, a solution which is evolving in some\n",
    "    sense, and local per-node computation.  In this case the nodes only communicate when\n",
    "    gathering results for publication.\"\"\"\n",
    "    # Problem geometry\n",
    "    xmin, xmax = 0, np.pi\n",
    "    ymin, ymax = 0, 2 * np.pi\n",
    "    dy = (ymax - ymin) // mpi.size\n",
    "\n",
    "    freqs = np.linspace(0.6, 1, nsteps)\n",
    "    for j in range(nsteps):\n",
    "        nx, ny = 2 + j // 4, 2 + j // 2 // mpi.size\n",
    "        nyt = mpi.size * ny\n",
    "        Xax = np.linspace(xmin, xmax, nx)\n",
    "        Yax = np.linspace(\n",
    "            ymin + rank * dy, ymin + (rank + 1) * dy, ny, endpoint=rank == mpi.size\n",
    "        )\n",
    "        X, Y = np.meshgrid(Xax, Yax)\n",
    "        f = freqs[j]\n",
    "        Z = np.cos(f * (X ** 2 + Y ** 2))\n",
    "\n",
    "        # We are now going to publish data to the clients. We take advantage of fast\n",
    "        # MPI communications and gather the Z mesh at the rank 0 node in the Zcat variable:\n",
    "        Zcat = mpi.gather(Z, root=0)\n",
    "        if mpi.rank == 0:\n",
    "            # Then we use numpy's concatenation to construct a single numpy array with the\n",
    "            # full mesh that can be sent to the client for visualization:\n",
    "            Zcat = np.concatenate(Zcat)\n",
    "            # We now can send a dict with the variables we want the client to have access to:\n",
    "            publish_data(dict(Z=Zcat, nx=nx, nyt=nyt, j=j, nsteps=nsteps))\n",
    "\n",
    "        # We add a small delay to simulate that a real-world computation\n",
    "        # would take much longer, and we ensure all nodes are synchronized\n",
    "        time.sleep(delay)\n",
    "        # The stop flag can be set remotely via IPython, allowing the simulation to be\n",
    "        # cleanly stopped from the outside\n",
    "        if stop:\n",
    "            break"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## IPython tools to interactively monitor and plot the MPI results"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We now define a local (to this notebook) plotting function that fetches data from the engines' global namespace.  Once it has retrieved the current state of the relevant variables, it produces and returns a figure:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "from IPython.display import display, clear_output\n",
    "\n",
    "\n",
    "def plot_current_results(ar, in_place=True):\n",
    "    \"\"\"Makes a blocking call to retrieve remote data and displays the solution mesh\n",
    "    as a contour plot.\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    ar : async result object\n",
    "\n",
    "    in_place : bool\n",
    "        By default it calls clear_output so that new plots replace old ones.  Set\n",
    "        to False to allow keeping of all previous outputs.\n",
    "    \"\"\"\n",
    "    # Read data from MPI rank 0 engine\n",
    "    data = ar.data[engine_mpi[0]]\n",
    "\n",
    "    try:\n",
    "        nx, nyt, j, nsteps = [data[k] for k in [\"nx\", \"nyt\", \"j\", \"nsteps\"]]\n",
    "        Z = data[\"Z\"]\n",
    "    except KeyError:\n",
    "        # This can happen if we read from the engines so quickly that the data\n",
    "        # hasn't arrived yet.\n",
    "        fig, ax = plt.subplots()\n",
    "        ax.plot([])\n",
    "        ax.set_title(\"No data yet\")\n",
    "        display(fig)\n",
    "        return fig\n",
    "    else:\n",
    "\n",
    "        fig, ax = plt.subplots()\n",
    "        ax.contourf(Z)\n",
    "        ax.set_title(\"Mesh: %i x %i, step %i/%i\" % (nx, nyt, j + 1, nsteps))\n",
    "        plt.axis(\"off\")\n",
    "        # We clear the notebook output before plotting this if in-place\n",
    "        # plot updating is requested\n",
    "        if in_place:\n",
    "            clear_output(wait=True)\n",
    "        display(fig)\n",
    "\n",
    "        return fig"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally, this is a convenience wrapper around the plotting code so that we can interrupt monitoring at any point, and that will provide basic timing information:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def monitor_simulation(ar, refresh=5.0, plots_in_place=True):\n",
    "    \"\"\"Monitor the simulation progress and call plotting routine.\n",
    "\n",
    "    Supress KeyboardInterrupt exception if interrupted, ensure that the last \n",
    "    figure is always displayed and provide basic timing and simulation status.\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    ar : async result object\n",
    "\n",
    "    refresh : float\n",
    "      Refresh interval between calls to retrieve and plot data.  The default\n",
    "      is 5s, adjust depending on the desired refresh rate, but be aware that \n",
    "      very short intervals will start having a significant impact.\n",
    "\n",
    "    plots_in_place : bool\n",
    "       If true, every new figure replaces the last one, producing a (slow)\n",
    "       animation effect in the notebook.  If false, all frames are plotted\n",
    "       in sequence and appended in the output area.\n",
    "    \"\"\"\n",
    "    import datetime as dt, time\n",
    "    \n",
    "    if ar.ready():\n",
    "        ar.get()\n",
    "        ar.wait_for_output()\n",
    "        plot_current_results(ar, in_place=plots_in_place)\n",
    "        plt.close('all')\n",
    "        print('Simulation has already finished, no monitoring to do.')\n",
    "        return\n",
    "    \n",
    "    t0 = dt.datetime.now()\n",
    "    fig = None\n",
    "    try:\n",
    "        while not ar.ready():\n",
    "            fig = plot_current_results(ar, in_place=plots_in_place)\n",
    "            plt.close('all') # prevent re-plot of old figures\n",
    "            time.sleep(refresh)\n",
    "    except (KeyboardInterrupt, ipp.error.TimeoutError):\n",
    "        msg = 'Monitoring interrupted, simulation is ongoing!'\n",
    "    else:\n",
    "        msg = 'Simulation completed!'\n",
    "    tmon = dt.datetime.now() - t0\n",
    "    if plots_in_place and fig is not None:\n",
    "        clear_output(wait=True)\n",
    "        plt.close('all')\n",
    "        display(fig)\n",
    "    print(msg)\n",
    "    print('Monitored for: %s.' % tmon)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Interactive monitoring in the client of the published data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now, we can monitor the published data. We submit the simulation for execution as an asynchronous task, and then monitor this task at any frequency we desire."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# And now we call on all available nodes our simulation routine,\n",
    "# as an asynchronous task\n",
    "ar = view.apply_async(lambda : simulation(nsteps=100, delay=0.1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x444.984 with 1 Axes>"
      ]
     },
     "metadata": {
      "image/png": {
       "height": 365,
       "width": 572
      }
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Simulation completed!\n",
      "Monitored for: 0:00:11.457755.\n"
     ]
    }
   ],
   "source": [
    "monitor_simulation(ar, refresh=1)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.6"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {
     "31b6b4a0105148e187aadfc70e0fe1c7": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_c872eb3aedc4492eb5a7d3b3c24249bb",
       "style": "IPY_MODEL_7b50ee6a201f48f796c337a68ba8730c",
       "value": " 4/4 [00:05&lt;00:00,  5.23s/engine]"
      }
     },
     "401e2a9344964c7082435def275db2c8": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "650e652f16044e4f816006c8f334eadb": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_9a56d508e10842299d798de5d18aa84a",
       "style": "IPY_MODEL_fe5f5baeb0b24e13bfb0aa8e3d411b0b",
       "value": "100%"
      }
     },
     "7b50ee6a201f48f796c337a68ba8730c": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "7d5e98d4de4b472080ce751a65546968": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "bar_style": "success",
       "layout": "IPY_MODEL_401e2a9344964c7082435def275db2c8",
       "max": 4,
       "style": "IPY_MODEL_a577270a23bf46fa933a41e32d1a5a79",
       "value": 4
      }
     },
     "9a56d508e10842299d798de5d18aa84a": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "a577270a23bf46fa933a41e32d1a5a79": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "bba28e827ace46e9b233476330b76938": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "c872eb3aedc4492eb5a7d3b3c24249bb": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "da09992ca3fd438eadf96a6599d5384e": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_650e652f16044e4f816006c8f334eadb",
        "IPY_MODEL_7d5e98d4de4b472080ce751a65546968",
        "IPY_MODEL_31b6b4a0105148e187aadfc70e0fe1c7"
       ],
       "layout": "IPY_MODEL_bba28e827ace46e9b233476330b76938"
      }
     },
     "fe5f5baeb0b24e13bfb0aa8e3d411b0b": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     }
    },
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
